package admin

import (
	"e_mall_server/models"
	"e_mall_server/service"
	"github.com/gin-gonic/gin"
	"go.uber.org/zap"
	"strconv"
)

/**
 * @Author: zhaobin
 * @Description TODO
 * @Date: 2022-04-27 0:25
 */

// GetRoleList 获取角色列表接口
func GetRoleList(c *gin.Context) {
	roleList, err := service.GetRoleList()
	if err != nil {
		zap.L().Error("service.GetRoleList() failed", zap.Error(err))
		ResponseError(c, "查询角色列表失败")
		return
	}
	ResponseSuccess(c, roleList)
}

// GetRoleDetailById 通过角色id获取角色详细信息
func GetRoleDetailById(c *gin.Context) {
	idStr := c.Param("id")
	id, err := strconv.ParseInt(idStr, 10, 64)
	if err != nil {
		zap.L().Error("GetRoleDetailById with invalid param", zap.Error(err))
		ResponseError(c, "请求参数错误")
	}
	role, err := service.GetRoleDetailById(id)
	if err != nil {
		zap.L().Error("service.GetRoleDetailById(id) failed", zap.Error(err))
		ResponseError(c, "获取角色信息错误")
		return
	}
	ResponseSuccess(c, role)
}

// AddRole 添加角色信息接口
func AddRole(c *gin.Context) {
	role := models.Role{}
	if err := c.ShouldBind(&role); err != nil {
		ResponseError(c, "请求参数错误")
		return
	}

	// 业务逻辑处理
	if err := service.AddRole(&role); err != nil {
		zap.L().Error("service.AddRole(&role) failed", zap.Error(err))
		ResponseError(c, "增加角色失败 请重试")
		return
	}
	// 创建成功返回响应
	ResponseSuccess(c, nil)
}

// UpdateRole 修改角色信息接口
func UpdateRole(c *gin.Context) {
	role := models.Role{}
	if err := c.ShouldBind(&role); err != nil {
		zap.L().Error("UpdateRole with invalid param", zap.Error(err))
		ResponseError(c, "请求参数错误")
		return
	}

	// 业务逻辑处理
	if count := service.UpdateRole(&role); count > 0 {
		// 创建成功返回响应
		ResponseSuccess(c, nil)
		return
	}
	ResponseError(c, "修改角色失败 请重试")
}

// DeleteRole 删除角色接口
func DeleteRole(c *gin.Context) {
	id, err := strconv.ParseInt(c.Param("id"), 10, 64)
	if err != nil {
		zap.L().Error("DeleteRole with invalid param", zap.Error(err))
		ResponseError(c, "传入参数错误")
		return
	}
	if count := service.DeleteRoleById(id); count > 0 {
		ResponseSuccess(c, nil)
		return
	}
	ResponseError(c, "删除失败")
}

// GetRoleAccessById 通过角色id获取其对应的权限
func GetRoleAccessById(c *gin.Context) {
	id, err := strconv.ParseInt(c.Param("id"), 10, 64)
	if err != nil {
		zap.L().Error("DeleteRole with invalid param", zap.Error(err))
		ResponseError(c, "传入参数错误")
		return
	}
	accessList, err := service.GetAccessListByRoleId(id)
	if err != nil {
		zap.L().Error("service.GetAccessListByRoleId(id) failed", zap.Error(err))
		ResponseError(c, "获取角色权限信息错误")
		return
	}
	//zap.L().Debug("accessList的数据是", zap.Any("value", accessList))
	ResponseSuccess(c, accessList)

}

// AuthAccessToRole 给角色分配权限
func AuthAccessToRole(c *gin.Context) {
	// 获取角色id
	id, err := strconv.ParseInt(c.Param("id"), 10, 64)
	if err != nil {
		zap.L().Error("AuthAccessToRole with invalid param", zap.Error(err))
		ResponseError(c, "传入参数错误")
		return
	}

	// 获取权限的ids
	roleAccessParam := models.RoleAccessParam{}
	if err := c.ShouldBind(&roleAccessParam); err != nil {
		zap.L().Error("UpdateRole with invalid param", zap.Error(err))
		ResponseError(c, "请求参数错误")
		return
	}

	// 给当前角色分配权限
	if err := service.AuthAccessToRole(id, roleAccessParam.Ids); err != nil {
		zap.L().Error("service.AuthAccessToRole(id, roleParam) failed", zap.Error(err))
		ResponseError(c, "请求参数失败")
		return
	}
	ResponseSuccess(c, "分配权限成功")
}
